/*-
* See the file LICENSE for redistribution information.
*
* Copyright (c) 2000-2006
* Sleepycat Software. All rights reserved.
*
* $Id: DbEnvPool.java,v 1.1 2006/05/06 09:00:23 ckaestne Exp $
*/
package com.sleepycat.je.dbi;
import java.io.File;
import java.io.IOException;
import java.util.Hashtable;
import java.util.Map;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.EnvironmentConfig;
/**
* Singleton collection of database environments.
*/
public class DbEnvPool {
/* singleton instance. */
private static DbEnvPool pool = new DbEnvPool();
/*
* Collection of environment handles, mapped by canonical directory
* name->EnvironmentImpl object.
*/
private Map envs;
/**
* Enforce singleton behavior.
*/
private DbEnvPool() {
envs = new Hashtable();
}
/**
* Access the singleton instance.
*/
public static DbEnvPool getInstance() {
return pool;
}
/**
* If the environment is not open, open it.
*/
public EnvironmentImplInfo getEnvironment(File envHome,
EnvironmentConfig config )
throws DatabaseException {
return getEnvironment(envHome, config, true);
}
/*
* Only return an environment if it's already bee open in this process.
*/
public EnvironmentImplInfo getExistingEnvironment(File envHome)
throws DatabaseException {
return getEnvironment(envHome, null, false);
}
/**
* Find a single environment, used by Environment handles and by command
* line utilities.
*/
private synchronized
EnvironmentImplInfo getEnvironment(File envHome,
EnvironmentConfig config,
boolean openIfNeeded)
throws DatabaseException {
boolean found;
boolean firstHandle = false;
EnvironmentImpl environmentImpl = null;
String environmentKey = getEnvironmentMapKey(envHome);
if (envs.containsKey(environmentKey)) {
/* Environment is resident */
environmentImpl = (EnvironmentImpl) envs.get(environmentKey);
if (!environmentImpl.isOpen()) {
if (openIfNeeded) {
environmentImpl.open();
found = true;
} else {
found = false;
}
} else {
found = true;
}
} else {
if (openIfNeeded) {
/*
* Environment must be instantiated. If it can be created,
* the configuration must have allowCreate set.
*/
environmentImpl = new EnvironmentImpl(envHome, config);
envs.put(environmentKey, environmentImpl);
firstHandle = true;
found = true;
} else {
found = false;
}
}
if (found) {
return new EnvironmentImplInfo(environmentImpl, firstHandle);
} else {
return new EnvironmentImplInfo(null, false);
}
}
/**
* Remove a EnvironmentImpl from the pool because it's been closed.
*/
void remove(File envHome)
throws DatabaseException {
envs.remove(getEnvironmentMapKey(envHome));
}
public void clear() {
envs.clear();
}
/*
* Struct for returning two values.
*/
public static class EnvironmentImplInfo {
public EnvironmentImpl envImpl;
public boolean firstHandle = false;
EnvironmentImplInfo(EnvironmentImpl envImpl, boolean firstHandle) {
this.envImpl = envImpl;
this.firstHandle = firstHandle;
}
}
/* Use the canonical path name for a normalized environment key. */
private String getEnvironmentMapKey(File file)
throws DatabaseException {
try {
return file.getCanonicalPath();
} catch (IOException e) {
throw new DatabaseException(e);
}
}
}